#!/bin/bash

#1 获取输入参数个数，如果没有参数，直接退出
FILE_COUNT=$#
if((FILE_COUNT==0)); then
    echo ">>> 错误：未传递文件参数！"
    echo "  用法：mysql5719_master_docker.sh rootPassword"
    exit;
fi
MYSQL_ROOT_PASSWORD=$1
# 创建数据目录
MODULE_PATH=/opt/module/mysql5719/master
MASTER_DOCKER_NAME=mysql5719_master

# 删除数据目录及窗器
rm -rf $MODULE_PATH
if(( `docker ps -a | grep $MASTER_DOCKER_NAME | wc -l` >0 ));then
    docker rm -f $MASTER_DOCKER_NAME
fi

# 创建数据目录
for folder in "data" "logs" "config"; do
    if [ ! -d "$MODULE_PATH/$folder" ]; then
        mkdir -p $MODULE_PATH/$folder
        chmod 777 $MODULE_PATH/$folder
    fi
done
# 创建同步用户脚本
cat >$MODULE_PATH/logs/user_replication.sh<<End
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF
create user 'replic'@'%' identified by 'replic';
grant replication slave on *.* to 'replic'@'%';
flush privileges;
EOF
End
chmod +x $MODULE_PATH/logs/user_replication.sh
# 创建配置文件
#出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误解
# 决方案，在my.cnf配置文件中设置
# sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO
# ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
cat >$MODULE_PATH/config/my.cnf<<EOF
#主库
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #服务id，不可重复
log-error=/var/log/mysql/error.log
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
binlog_format=MIXED
#要给从机同步的库
# binlog-do-db=dbname 
#不给从机同步的库(多个写多行)
binlog-ignore-db=mysql 
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#自动清理 7 天前的log文件,可根据需要修改
#expire_logs_days=7 
# 当开启二进制日志后，如果变量log_bin_trust_function_creators为OFF，那么创建或修改存储函数就会报“ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)”这样的错误
log_bin_trust_function_creators=TRUE
EOF



# 启动容器
docker run -d \
    --privileged=true \
    -v /etc/localtime:/etc/localtime:ro \
    -e TZ=Asia/Shanghai \
    -p 3306:3306 \
    --name $MASTER_DOCKER_NAME \
    -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
    -v $MODULE_PATH/data:/var/lib/mysql \
    -v $MODULE_PATH/logs:/var/log/mysql \
    -v $MODULE_PATH/config/my.cnf:/etc/mysql/conf.d/my.cnf \
    mysql:5.7.19

# 查看状态
docker logs $MASTER_DOCKER_NAME
echo "主库登录用户名：root，密码：$MYSQL_ROOT_PASSWORD"
echo "从库连接用户名：replic，密码：replic"
# 执行创建用户（复制权限）脚本

echo "手动执行：docker exec $MASTER_DOCKER_NAME sh /var/log/mysql/user_replication.sh"
echo "查看master状态：show master status;"
echo "查看二进制日志相关的配置项：show global variables like 'binlog%';"
echo "查看server相关的配置项：show global variables like 'server%';"


# ==============================
#       几种常见的mode介绍
# ==============================
# ONLY_FULL_GROUP_BY：出现在select语句、HAVING条件和ORDER BY语句中的列，必须是GROUP BY的列或者依赖于GROUP BY列的函数列。
# NO_AUTO_VALUE_ON_ZERO：该值影响自增长列的插入。默认设置下，插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0，而该列又是自增长的，那么这个选项就有用了。
# STRICT_TRANS_TABLES：在该模式下，如果一个值不能插入到一个事务表中，则中断当前的操作，对非事务表不做限制
# NO_ZERO_IN_DATE：这个模式影响了是否允许日期中的月份和日包含0。如果开启此模式，2016-01-00是不允许的，但是0000-02-01是允许的。它实际的行为受到 strict mode是否开启的影响1。
# NO_ZERO_DATE：设置该值，mysql数据库不允许插入零日期。它实际的行为受到 strictmode是否开启的影响2。
# ERROR_FOR_DIVISION_BY_ZERO：在INSERT或UPDATE过程中，如果数据被零除，则产生错误而非警告。如果未给出该模式，那么数据被零除时MySQL返回NULL
# NO_AUTO_CREATE_USER：禁止GRANT创建密码为空的用户
# NO_ENGINE_SUBSTITUTION：如果需要的存储引擎被禁用或未编译，那么抛出错误。不设置此值时，用默认的存储引擎替代，并抛出一个异常
# PIPES_AS_CONCAT：将”||”视为字符串的连接操作符而非或运算符，这和Oracle数据库是一样的，也和字符串的拼接函数Concat相类似
# ANSI_QUOTES：启用ANSI_QUOTES后，不能用双引号来引用字符串，因为它被解释为识别符



# ============= 本容器提供如下安装信息:============= 
# username：root
# password：123456
# port：3306
# ============== jdbc依赖 ==============
# <dependency>
#        <groupId>mysql</groupId>
#          <artifactId>mysql-connector-java</artifactId>
#         <version>5.1.47</version>
# </dependency>
#=============== url连接 ===============
# jdbc:mysql://${host}:${port}/${dbName}?characterEncoding=utf8&serverTimezone=UTC

# 远程连接报错：Docker MySql报2059错误: Authentication plugin 'caching_sha2_password' cannot be loaded 
# docker exec -it 容器id /bin/bash
# 再接着输入mysql -u root -p命令，然后输入自己的密码
# 然后输入更新密码语句：ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 最后重启mysqldocker restart